home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE16 / SCRNSAV / Sprite / SPRITES.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1996-11-10  |  6.5 KB  |  247 lines

  1. { *****************************************************
  2.                          ThgSprite Component
  3.  
  4.   This component is a sprite for quick animations such as 
  5.   bouncing logo's etc.
  6.  
  7.   TCustomSprite is an abstract base class to descend other
  8.   sprites from.
  9.  
  10.   TSprite is a TCustomSprite descendant which publishes the
  11.   AND and OR bitmaps so the user can set then at design
  12.   time.
  13.  
  14.                   Paul Warren
  15.          HomeGrown Software Development
  16.        (c) 1996 Langley British Columbia.
  17.                 (604) 856-6523
  18.          e-mail:  hg_soft@uniserve.com
  19.     Home page: http://haven.uniserve.com/~hg_soft
  20.   ***************************************************** }
  21.  
  22. unit Sprites;
  23.  
  24. interface
  25.  
  26. uses
  27.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  28.   Forms, Dialogs, StdCtrls;
  29.  
  30. type
  31.   TCustomSprite = class(TGraphicControl)
  32.   private
  33.     { private declarations }
  34.     FAndImage: TBitmap;
  35.     FOrImage: TBitmap;
  36.     procedure SetAndImage(AAndImage: TBitmap);
  37.     procedure SetOrImage(AOrImage: TBitmap);
  38.   protected
  39.     { protected declarations }
  40.     procedure Paint; override;
  41.   public
  42.     { public declarations }
  43.     constructor Create(AOwner: TComponent); override;
  44.     destructor Destroy; override;
  45.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  46.     procedure MoveSprite; virtual; abstract;
  47.     property AndImage: TBitmap read FAndImage write SetAndImage;
  48.     property OrImage: TBitmap read FOrImage write SetOrImage;
  49.   published
  50.     { published declarations }
  51.   end;
  52.  
  53.   TSpriteMoveEvent = procedure(Sender: TObject;
  54.       var Bounds: TRect) of object;
  55.  
  56.   TSprite = class(TCustomSprite)
  57.   private
  58.     { private declarations }
  59.     FSLeft: integer;
  60.     FSTop: integer;
  61.     FVX, FVY: integer;
  62.     FOnMove: TSpriteMoveEvent;
  63.     FOnBounce: TNotifyEvent;
  64.     procedure SetVX(Value: integer);
  65.     procedure SetVY(Value: integer);
  66.     procedure SetOnMove(Value: TSpriteMoveEvent);
  67.     procedure SetOnBounce(Value: TNotifyEvent);
  68.   protected
  69.     { protected declarations }
  70.     procedure Paint; override;
  71.     procedure Loaded; override;
  72.   public
  73.     { public declarations }
  74.     constructor Create(AOwner: TComponent); override;
  75.     procedure MoveSprite; override;
  76.     property SLeft: integer read FSLeft write FSLeft;
  77.     property STop: integer read FSTop write FSTop;
  78.   published
  79.     { published declarations }
  80.     property VX: integer read FVX write SetVX;
  81.     property VY: integer read FVY write SetVY;
  82.     property OnMove: TSpriteMoveEvent read FOnMove write SetOnMove;
  83.     property OnBounce: TNotifyEvent read FOnBounce write SetOnBounce;
  84.     property AndImage;
  85.     property OrImage;
  86.   end;
  87.  
  88. procedure Register;
  89.  
  90. implementation
  91.  
  92. { TCustomSprite base class }
  93.  
  94. constructor TCustomSprite.Create(AOwner: TComponent);
  95. begin
  96.   inherited Create(AOwner);
  97.   { create bitmap instances }
  98.   FAndImage := TBitmap.Create;
  99.   FOrImage := TBitmap.Create;
  100.   Width := 60;
  101.   Height := 60;
  102. end;
  103.  
  104. destructor TCustomSprite.Destroy;
  105. begin
  106.   { free bitmap instances }
  107.   FAndImage.Free;
  108.   FOrImage.Free;
  109.   inherited Destroy;
  110. end;
  111.  
  112. procedure TCustomSprite.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  113. begin
  114.   { SetBounds sets the component bounds to the size of the
  115.   image if an image is loaded. }
  116.   if (FAndImage.Width > 0) and (FAndImage.Height > 0) then
  117.     inherited SetBounds(ALeft, ATop, FAndImage.Width, FAndImage.Height)
  118.   else inherited SetBounds(ALeft, ATop, AWidth, AHeight);
  119. end;
  120.  
  121. procedure TCustomSprite.SetAndImage(AAndImage: TBitmap);
  122. begin
  123.   {Copy And image data from source bitmap}
  124.   FAndImage.Assign(AAndImage);
  125.   { set size }
  126.   Width := AndImage.Width;
  127.   Height := AndImage.Height;
  128.   Invalidate;
  129. end;
  130.  
  131. procedure TCustomSprite.SetOrImage(AOrImage: TBitmap);
  132. begin
  133.   {Copy Or image data from source bitmap}
  134.   FOrImage.Assign(AOrImage);
  135.   { set size }
  136.   Width := OrImage.Width;
  137.   Height := OrImage.Height;
  138.   Invalidate;
  139. end;
  140.  
  141. procedure TCustomSprite.Paint;
  142. begin
  143.   { Paint the component as a dashed clear box at design
  144.     time. Do nothing at run time. }
  145.   if csDesigning in ComponentState then
  146.     with Canvas do
  147.     begin
  148.       Pen.Style := psDash;
  149.       Brush.Style := bsClear;
  150.       Rectangle(0, 0, Width, Height);
  151.     end;
  152. end;
  153.  
  154. { TSprite }
  155.  
  156. constructor TSprite.Create(AOwner: TComponent);
  157. begin
  158.   inherited Create(AOwner);
  159.   { Initiallize acceleration fields with 1 or
  160.     -1 randomly }
  161.   FVX := random(2);
  162.   FVY := random(2);
  163.   if FVX = 0 then FVX := -1;
  164.   if FVY = 0 then FVY := -1;
  165. end;
  166.  
  167. { set sprite position equal to component
  168.   position AFTER component is loaded }
  169. procedure TSprite.Loaded;
  170. begin
  171.   SLeft := Left;
  172.   STop := Top;
  173. end;
  174.  
  175. { SetVX - if the value is -1, 0 or 1 then set the direction
  176.   vector. This indicates a bounce condition
  177.   in most cases so create an OnBounce event }
  178. procedure TSprite.SetVX(Value: integer);
  179. begin
  180.   if (Value >= -1) and (Value <= 1) then
  181.   begin
  182.     FVX := Value;
  183.     if Assigned(FOnBounce) then OnBounce(Self);
  184.   end;
  185. end;
  186.  
  187. { SetVY - if the value is -1, 0 or 1 then set the direction
  188.   vector. This indicates a bounce condition
  189.   in most cases so create an OnBounce event }
  190. procedure TSprite.SetVY(Value: integer);
  191. begin
  192.   if (Value >= -1) and (Value <= 1) then
  193.   begin
  194.     FVY := Value;
  195.     if Assigned(FOnBounce) then OnBounce(Self);
  196.   end;
  197. end;
  198.  
  199. procedure TSprite.SetOnMove(Value: TSpriteMoveEvent);
  200. begin
  201.   FOnMove := Value;
  202. end;
  203.  
  204. procedure TSprite.SetOnBounce(Value: TNotifyEvent);
  205. begin
  206.   FOnBounce := Value;
  207. end;
  208.  
  209. { Paint - the component as a dashed clear box the
  210.   size of any loaded image, with the image rendered,
  211.   at design time. Do nothing at run time. }
  212. procedure TSprite.Paint;
  213. begin
  214.   if csDesigning in ComponentState then
  215.     with Canvas do
  216.     begin
  217.       Pen.Style := psDash;
  218.       Brush.Style := bsClear;
  219.       Rectangle(0, 0, Width, Height);
  220.       CopyMode := cmSrcAnd;
  221.       CopyRect(ClientRect,FANDImage.Canvas,ClientRect);
  222.       CopyMode := cmSrcPaint;
  223.       CopyRect(ClientRect,FORImage.Canvas,ClientRect);
  224.     end;
  225. end;
  226.  
  227. { MoveSprite - set bounds to the size and LOCATION of the
  228.   image. Trigger an OnMove event. Set the location
  229.   of the sprite to any changed value of bounds. }
  230. procedure TSprite.MoveSprite;
  231. var
  232.   Bounds: TRect;
  233. begin
  234.   Bounds := Rect(SLeft,STop,SLeft+Width,STop+Height);
  235.   if Assigned(FOnMove) then OnMove(Self, Bounds);
  236.   SLeft := Bounds.Left;
  237.   STop := Bounds.Top;
  238. end;
  239.  
  240. { register component on Misc page }
  241. procedure Register;
  242. begin
  243.   RegisterComponents('Misc', [TSprite]);
  244. end;
  245.  
  246. begin
  247.   randomize;
  248. end.